Bug 559622 – GdkDevice test segfaults
authorChristian Dywan <christian@imendio.com>
Sun, 30 Nov 2008 05:33:57 +0000 (05:33 +0000)
committerChristian Dywan <cdywan@src.gnome.org>
Sun, 30 Nov 2008 05:33:57 +0000 (05:33 +0000)
2008-11-30  Christian Dywan  <christian@imendio.com>

Bug 559622 – GdkDevice test segfaults

* gdk/x11/gdkdisplay-x11.c (gdk_display_x11_dispose):
* gdk/x11/gdkinput.c (gdk_device_class_init), (gdk_device_dispose):
Free and reset device in dispose. Patch by Michael Natterer and myself.

svn path=/trunk/; revision=21834

ChangeLog
gdk/x11/gdkdisplay-x11.c
gdk/x11/gdkinput.c

index b105c177690dfb346f476a644718d7faafbe22a1..ebe98eff6d4b735c5c031ccea5bd7617dd13fcfe 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2008-11-30  Christian Dywan  <christian@imendio.com>
+
+       Bug 559622 – GdkDevice test segfaults
+
+       * gdk/x11/gdkdisplay-x11.c (gdk_display_x11_dispose):
+       * gdk/x11/gdkinput.c (gdk_device_class_init), (gdk_device_dispose):
+       Free and reset device in dispose. Patch by Michael Natterer and myself.
+
 2008-11-30  Christian Dywan  <christian@imendio.com>
 
        Bug 554076 – eventually release g_new-ed supported_atoms
index cbef9ea439daaf0235ec922a7e2b22fbe05ba5a5..9f2dffcd04f7d81dab098aeb8a27fbc2248e54c2 100644 (file)
@@ -798,6 +798,8 @@ gdk_display_x11_dispose (GObject *object)
   GdkDisplayX11 *display_x11 = GDK_DISPLAY_X11 (object);
   gint           i;
 
+  g_list_foreach (display_x11->input_devices, (GFunc) g_object_run_dispose, NULL);
+
   for (i = 0; i < ScreenCount (display_x11->xdisplay); i++)
     _gdk_screen_close (display_x11->screens[i]);
 
index 7fb2bfeb7665e16b87cec0628f1c301e5da5e4a2..0d48e13f3ba3b5f3d748af7833fe97c933566a7c 100644 (file)
@@ -64,7 +64,7 @@ _gdk_init_input_core (GdkDisplay *display)
 }
 
 static void gdk_device_class_init (GdkDeviceClass *klass);
-static void gdk_device_finalize (GObject *object);
+static void gdk_device_dispose    (GObject        *object);
 
 static gpointer gdk_device_parent_class = NULL;
 
@@ -103,29 +103,36 @@ gdk_device_class_init (GdkDeviceClass *klass)
 
   gdk_device_parent_class = g_type_class_peek_parent (klass);
 
-  object_class->finalize = gdk_device_finalize;
+  object_class->dispose  = gdk_device_dispose;
 }
 
 static void
-gdk_device_finalize (GObject *object)
+gdk_device_dispose (GObject *object)
 {
-  GdkDevicePrivate *gdkdev = (GdkDevicePrivate *)GDK_DEVICE(object);
+  GdkDevicePrivate *gdkdev = (GdkDevicePrivate *) object;
 
-  if (!GDK_IS_CORE (gdkdev))
+  if (gdkdev->display && !GDK_IS_CORE (gdkdev))
     {
 #ifndef XINPUT_NONE
       if (gdkdev->xdevice)
-        XCloseDevice (GDK_DISPLAY_XDISPLAY(gdkdev->display), gdkdev->xdevice);
-
+        {
+          XCloseDevice (GDK_DISPLAY_XDISPLAY (gdkdev->display), gdkdev->xdevice);
+          gdkdev->xdevice = NULL;
+        }
       g_free (gdkdev->axes);
+      gdkdev->axes = NULL;
 #endif /* !XINPUT_NONE */
 
       g_free (gdkdev->info.name);
       g_free (gdkdev->info.keys);
       g_free (gdkdev->info.axes);
+
+      gdkdev->info.name = NULL;
+      gdkdev->info.keys = NULL;
+      gdkdev->info.axes = NULL;
     }
 
-  G_OBJECT_CLASS (gdk_device_parent_class)->finalize (object);
+  G_OBJECT_CLASS (gdk_device_parent_class)->dispose (object);
 }
 
 /**